﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Client1.localhost;
using System.Windows.Forms.DataVisualization.Charting;

using System.IO;
using System.Net.Sockets;
using System.Threading;


namespace Client1
{
    public partial class Form1 : Form
    {


        /**
         * Variáveis de verificação de eventos
         * serão utilizadas para checar se o
         * ano foi selecionado e/ou se o mes foi 
         * selecionado.
         */
        Boolean anoFoiSelecionado = false;
        Boolean mesFoiSelecionado = false;

        private NetworkStream networkStream;
        private BinaryWriter binaryWriter;
        private BinaryReader binaryReader;
        private TcpClient tcpClient;

        private Thread thread;


        public Form1()
        {
            InitializeComponent();
            cklbAno.ColumnWidth = 50; //Seta tamanho da coluna do cklbAno
            cklbMes.ColumnWidth = 30; //Seta tamanho da coluna do cklbMes
            cklbDia.ColumnWidth = 30; //Seta tamanho da coluna do cklbDia
            thread = new Thread(new ThreadStart(RunClient));
            thread.Start();
            
        
        }

        public void RunClient()
        {
            try
            {
                tcpClient = new TcpClient();
                tcpClient.Connect("127.0.0.1", 2001);

                networkStream = tcpClient.GetStream();
                binaryWriter = new BinaryWriter(networkStream);
                binaryReader = new BinaryReader(networkStream);

                String message = "";
                do
                {
                    try
                    {
                        message = binaryReader.ReadString();
                        MessageBox.Show(message, "Mensagem Recebida do servidor");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Erro");
                        message = "FIM";
                    }
                } while (message != "FIM");

                binaryWriter.Close();
                binaryReader.Close();
                networkStream.Close();
                tcpClient.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro");
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {                 

            
            try
            {

                //Instacia Objetos
                Service1 srv = new Service1();
                List<Relatorio> lista = new List<Relatorio>();
                List<Avaliacao> listaAval = new List<Avaliacao>();


                //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                //~~~~~~~~~~~~~ VISAO CONSULTA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                /**
                 * ###############################
                 * CARREGA LB CONSULTA POR MEDICO
                 * ###############################
                 */ 
                //Lista recebe consulta por MEDICO
                lista = srv.qtdConsulta("medico").ToList();

                //Preenche ListView
                foreach (Relatorio r in lista)
                {
                    ListViewItem item = lvConsMed.Items.Add(r.Descricao);
                    item.SubItems.Add(r.Quantitativo.ToString());
                }
                //--- FIM CARREGA LB CONSULTA POR MEDICO -------------------------------------------




                /**
                * ######################################
                * CARREGA LB CONSULTA POR ESPECIALIDADE
                * ######################################
                */

                //Lista recebe consulta por ESPECIALIDADE
                lista = srv.qtdConsulta("especialidade").ToList();

                //Preenche ListView
                foreach (Relatorio r in lista)
                {
                    ListViewItem item = lvConsEsp.Items.Add(r.Descricao);
                    item.SubItems.Add(r.Quantitativo.ToString());
                }
                //--- FIM CARREGA LB CONSULTA POR ESPECIALIDADE -------------------------------------------




                /**
                 * ######################################
                 * CARREGA GRAFICO CONSULTA POR CONVENIO
                 * ######################################
                 */ 

                //Grafico de Convenio
                List<Relatorio> graficoConv = new List<Relatorio>();
                graficoConv = srv.qtdConsulta("convenio").ToList();
                chart4.DataSource = graficoConv;
                //--- FIM CARREGA GRAFICO CONSULTA POR CONVENIO -------------------------------------------




                /**
                * ####################################
                * CARREGA GRAFICO CONSULTA POR STATUS
                * ####################################
                */ 
                // Grafico Status
                List<Relatorio> grafconsulta = new List<Relatorio>();
                grafconsulta = srv.qtdConsultaPorcentagemRealizado("status").ToList();
                chart3.DataSource = grafconsulta;
                //--- FIM CARREGA GRAFICO CONSULTA POR STATUS -------------------------------------------



                

















                //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                //~~~~~~~~~~~~~ VISAO MEDICO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                /**
                 * ####################################
                 * CARREGA LB MEDICO POR ESPECIALIDADE
                 * ####################################
                 */ 
                //Lista recebe consulta por ESPECIALIDADE
                lista = srv.qtdEspecialidade().ToList();

                //Preenche ListView
                foreach (Relatorio r in lista)
                {
                    ListViewItem item = lvMedEsp.Items.Add(r.Descricao);
                    item.SubItems.Add(r.Quantitativo.ToString());
                }
                //--- FIM CARREGA LB MEDICO POR ESPECIALIDADE -------------------------------------------




                /**
                 * ######################################
                 * CARREGA GRAFICO MEDICO POR CONSULTA
                 * ######################################
                 */

                //Grafico de Convenio
                List<Relatorio> graficoMedCon = new List<Relatorio>();
                graficoMedCon = srv.qtdConsulta("medico").ToList();
                chart1.DataSource = graficoMedCon;
                chart1.DataBind();
                //--- FIM CARREGA GRAFICO MEDICO POR CONSULTA -------------------------------------------




                /**
                 * ################################
                 * CARREGA MEDICO LB POR AVALIACAO
                 * ################################
                 */ 
                listaAval = srv.avaliacao().ToList();

                foreach (Avaliacao a in listaAval)
                {
                    ListViewItem item = lvMedAva.Items.Add(a.Nome);
                    item.SubItems.Add(a.Pontualidade.ToString());
                    item.SubItems.Add(a.Atencao.ToString());
                    item.SubItems.Add(a.Polidez.ToString());
                    item.SubItems.Add(a.Clareza.ToString());
                    item.SubItems.Add(a.Recomend.ToString());

                }
                //--- FIM CARREGA MEDICO LB POR AVALIACAO -------------------------------------------






                /**
                 * ###################
                 * CARREGA ESTATISTICA
                 * ###################
                 */ 
                //lbTotPac.Text = srv.quantidade("paciente").ToString();
                lbTotMed.Text = srv.quantidade("medico").ToString();
                lbMedia.Text = (srv.quantidade("agregadoconsulta") / srv.quantidade("medico")).ToString();
                //--- FIM CARREGA ESTATISTICA -------------------------------------------------------------






                /**
                 * ##################
                 * CARREGA CALENDARIO
                 * ##################
                 */ 

                //ANO
                List<String> listaAno = new List<String>();
                listaAno = srv.retornaPeriodo("year").ToList();

                foreach (String s in listaAno)
                {
                    cklbAno.Items.Add(s);
                }

                //MES
                List<String> listaMesTotal = new List<String>();
                listaMesTotal = srv.retornaPeriodo("month").ToList();

                foreach (String s in listaMesTotal)
                {
                    cklbMes.Items.Add(s);
                }

                //DIA
                List<String> listaDiaTotal = new List<String>();
                listaDiaTotal = srv.retornaPeriodo("day").ToList();

                foreach (String s in listaDiaTotal)
                {
                    cklbDia.Items.Add(s);
                }
                //--- FIM CARREGA CALENDARIO -------------------------------------------------------------





            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }





        }

        private void cklbAno_SelectedIndexChanged(object sender, EventArgs e)
        {
            /**
             * Instancia objetos
             */
            List<String> listaMes = new List<String>();
            List<Relatorio> lista = new List<Relatorio>();
            Service1 srv = new Service1();

            //Liga chave de verificacao
            anoFoiSelecionado = true;
            mesFoiSelecionado = false;
                     
            /**
            * #########################
            * ATUALIZA CKLB MES
            * #########################
            */ 
            cklbMes.Items.Clear();
            listaMes = srv.retornaMes(cklbAno.SelectedItem.ToString()).ToList();

            foreach (String s in listaMes)
            {
                cklbMes.Items.Add(s);
            }
            //--- FIM ATUALIZA CKLB MES -------------------------------------------------------------




            /**
             * #####################################
             * CARREGA LB CONSULTA POR MEDICO  (ANO)
             * #####################################
             */
            //Lista recebe consulta por MEDICO
            lista = srv.qtdConsultaFiltro("medico",cklbAno.SelectedItem.ToString(),"","").ToList();
            lvConsMed.Items.Clear();//LIMPA LISTBOX
            //Preenche ListView
            foreach (Relatorio r in lista)
            {
                ListViewItem item = lvConsMed.Items.Add(r.Descricao);
                item.SubItems.Add(r.Quantitativo.ToString());
            }
            //--- FIM CONSULTA POR MEDICO  (ANO) -------------------------------------------------------------




            /**
            * ###########################################
            * CARREGA LB CONSULTA POR ESPECIALIDADE (ANO)
            * ###########################################
            */

            //Lista recebe consulta por ESPECIALIDADE
            lista = srv.qtdConsultaFiltro("especialidade", cklbAno.SelectedItem.ToString(), "", "").ToList();
            lvConsEsp.Items.Clear();//LIMPA LISTBOX
            //Preenche ListView
            foreach (Relatorio r in lista)
            {
                ListViewItem item = lvConsEsp.Items.Add(r.Descricao);
                item.SubItems.Add(r.Quantitativo.ToString());
            }
            //--- FIM CARREGA LB CONSULTA POR ESPECIALIDADE (ANO) -------------------------------------------




            /**
             * ###########################################
             * CARREGA GRAFICO CONSULTA POR CONVENIO (ANO)
             * ###########################################
             */

            //Grafico de Convenio
            List<Relatorio> graficoConv = new List<Relatorio>();
            graficoConv = srv.qtdConsultaFiltro("convenio", cklbAno.SelectedItem.ToString(), "", "").ToList();
            chart4.DataSource = graficoConv;
            chart4.DataBind();
            //--- FIM CARREGA GRAFICO CONSULTA POR CONVENIO (ANO) -------------------------------------------

            

        }

        private void cklbMes_SelectedIndexChanged(object sender, EventArgs e)
        {
            /**
             * Verifica se o ano foi selecionado, 
             * se não, retorna mensagem
             * se foi, prossegue com filtros
             */
            if (anoFoiSelecionado == false)
            {
               try
                {
                    binaryWriter.Write("Selecione o ano!!");
                }
                catch (SocketException socketEx)
                {
                    MessageBox.Show(socketEx.Message, "Erro");
                }

            }

            else
            {

                /**
                 * Instancia objetos
                 */
                List<String> listaDia = new List<String>();
                List<Relatorio> lista = new List<Relatorio>();
                Service1 srv = new Service1();

                //Liga chave de verificacao
                mesFoiSelecionado = true;





                /**
                * #################
                * ATUALIZA CKLB DIA
                * #################
                */
                cklbDia.Items.Clear();

                listaDia = srv.retornaDia(cklbAno.SelectedItem.ToString(), cklbMes.SelectedItem.ToString()).ToList();

                foreach (String s in listaDia)
                {
                    cklbDia.Items.Add(s);
                }
                //--- FIM ATUALIZA CKLB DIA ---------------------------------------------------------------------------





                /**
                 * ########################################
                 * CARREGA LB CONSULTA POR MEDICO (ANO+MES)
                 * ########################################
                 */
                //Lista recebe consulta por MEDICO
                lista = srv.qtdConsultaFiltro("medico", cklbAno.SelectedItem.ToString(), cklbMes.SelectedItem.ToString(), "").ToList();
                lvConsMed.Items.Clear();//LIMPA LISTBOX
                //Preenche ListView
                foreach (Relatorio r in lista)
                {
                    ListViewItem item = lvConsMed.Items.Add(r.Descricao);
                    item.SubItems.Add(r.Quantitativo.ToString());
                }
                //--- FIM CARREGA LB CONSULTA POR MEDICO (ANO+MES) ---------------------------------------------------------------------------



                /**
                * ###############################################
                * CARREGA LB CONSULTA POR ESPECIALIDADE (ANO+MES)
                * ###############################################
                */

                //Lista recebe consulta por ESPECIALIDADE
                lista = srv.qtdConsultaFiltro("especialidade", cklbAno.SelectedItem.ToString(), cklbMes.SelectedItem.ToString(), "").ToList();
                lvConsEsp.Items.Clear();//LIMPA LISTBOX
                //Preenche ListView
                foreach (Relatorio r in lista)
                {
                    ListViewItem item = lvConsEsp.Items.Add(r.Descricao);
                    item.SubItems.Add(r.Quantitativo.ToString());
                }
                //--- FIM CARREGA LB CONSULTA POR ESPECIALIDADE (ANO+MES) -------------------------------------------


                /**
                 * ###########################################
                 * CARREGA GRAFICO CONSULTA POR CONVENIO (ANO+MES)
                 * ###########################################
                 */

                //Grafico de Convenio
                List<Relatorio> graficoConv = new List<Relatorio>();
                graficoConv = srv.qtdConsultaFiltro("convenio", cklbAno.SelectedItem.ToString(), cklbMes.SelectedItem.ToString(), "").ToList();
                chart4.DataSource = graficoConv;
                chart4.DataBind();
                //--- FIM CARREGA GRAFICO CONSULTA POR CONVENIO (ANO+MES) -------------------------------------------

               


            }

        }



        private void cklbDia_SelectedIndexChanged(object sender, EventArgs e)
        {
            /**
             * Verifica se o mes foi selecionado, 
             * se não, retorna mensagem
             * se foi, prossegue com filtros
             */

            if(anoFoiSelecionado == false && mesFoiSelecionado == false){

                try
                {
                    binaryWriter.Write("Selecione o Mes e ano!!");
                }
                catch (SocketException socketEx)
                {
                    MessageBox.Show(socketEx.Message, "Erro");
                }
            
            }
            else 
            if (mesFoiSelecionado == false)
            {
                try
                {
                    binaryWriter.Write("Selecione o Mes!!");
                }
                catch (SocketException socketEx)
                {
                    MessageBox.Show(socketEx.Message, "Erro");
                }

            }

            else
            {
                /**
                 * Instacia objetos
                 */
                List<Relatorio> lista = new List<Relatorio>();
                Service1 srv = new Service1();

                /**
                * ############################################
                * CARREGA LB CONSULTA POR MEDICO (ANO+MES+DIA)
                * ############################################
                */
                //Lista recebe consulta por MEDICO
                lista = srv.qtdConsultaFiltro("medico", cklbAno.SelectedItem.ToString(), cklbMes.SelectedItem.ToString(), cklbDia.SelectedItem.ToString()).ToList();
                lvConsMed.Items.Clear();//LIMPA LISTBOX
                //Preenche ListView
                foreach (Relatorio r in lista)
                {
                    ListViewItem item = lvConsMed.Items.Add(r.Descricao);
                    item.SubItems.Add(r.Quantitativo.ToString());
                }
                //--- FIM CARREGA LB CONSULTA POR MEDICO (ANO+MES+DIA) -------------------------------------------------





                /**
                * ###################################################
                * CARREGA LB CONSULTA POR ESPECIALIDADE (ANO+MES+DIA)
                * ###################################################
                */

                //Lista recebe consulta por ESPECIALIDADE
                lista = srv.qtdConsultaFiltro("especialidade", cklbAno.SelectedItem.ToString(), cklbMes.SelectedItem.ToString(), cklbDia.SelectedItem.ToString()).ToList();
                lvConsEsp.Items.Clear();//LIMPA LISTBOX
                //Preenche ListView
                foreach (Relatorio r in lista)
                {
                    ListViewItem item = lvConsEsp.Items.Add(r.Descricao);
                    item.SubItems.Add(r.Quantitativo.ToString());
                }
                //--- FIM CARREGA LB CONSULTA POR ESPECIALIDADE (ANO+MES+DIA) -------------------------------------------


                /**
                 * ###################################################
                 * CARREGA GRAFICO CONSULTA POR CONVENIO (ANO+MES+DIA)
                 * ###################################################
                 */

                //Grafico de Convenio
                List<Relatorio> graficoConv = new List<Relatorio>();
                graficoConv = srv.qtdConsultaFiltro("convenio", cklbAno.SelectedItem.ToString(), cklbMes.SelectedItem.ToString(), cklbDia.SelectedItem.ToString()).ToList();
                chart4.DataSource = graficoConv;
                chart4.DataBind();
                //--- FIM CARREGA GRAFICO CONSULTA POR CONVENIO (ANO+MES+DIA) -------------------------------------------


            }

        }




        /**
         * Botao para limpar filtros
         */ 
        private void button1_Click(object sender, EventArgs e)
        {


            try
            {


                //Instacia Objetos
                Service1 srv = new Service1();
                List<Relatorio> lista = new List<Relatorio>();
                List<Avaliacao> listaAval = new List<Avaliacao>();

                //RESETA VARIAVEIS DE VERIFICACAO
                anoFoiSelecionado = false;
                mesFoiSelecionado = false;

                //LIMPA LISTBOXES
                lvConsMed.Items.Clear();
                lvConsEsp.Items.Clear();

                //LIMPA CALENDARIO
                cklbAno.Items.Clear();
                cklbMes.Items.Clear();
                cklbDia.Items.Clear();


                /**
                 * #########################
                 * CARREGA CALENDARIOS
                 * #########################
                 */
                //ANO
                List<String> listaAno = new List<String>();
                listaAno = srv.retornaPeriodo("year").ToList();

                foreach (String s in listaAno)
                {
                    cklbAno.Items.Add(s);
                }

                //MES
                List<String> listaMesTotal = new List<String>();
                listaMesTotal = srv.retornaPeriodo("month").ToList();

                foreach (String s in listaMesTotal)
                {
                    cklbMes.Items.Add(s);
                }

                //DIA
                List<String> listaDiaTotal = new List<String>();
                listaDiaTotal = srv.retornaPeriodo("day").ToList();

                foreach (String s in listaDiaTotal)
                {
                    cklbDia.Items.Add(s);
                }
                //--- FIM CARREGA CALENDARIO -------------------------------------------



                /**
                 * ####################################
                 * CARREGA LISTBOX CONSULTA POR MEDICO
                 * ####################################
                 */

                //Lista recebe consulta por MEDICO
                lista = srv.qtdConsulta("medico").ToList();

                //Preenche ListView
                foreach (Relatorio r in lista)
                {
                    ListViewItem item = lvConsMed.Items.Add(r.Descricao);
                    item.SubItems.Add(r.Quantitativo.ToString());
                }
                //--- FIM CARREGA LISTBOX CONSULTA POR MEDICO ------------------------


                

                /**
                * ###########################################
                * CARREGA LISTBOX CONSULTA POR ESPECIALIDADE
                * ###########################################
                */

                //Lista recebe consulta por ESPECIALIDADE
                lista = srv.qtdConsulta("especialidade").ToList();

                //Preenche ListView
                foreach (Relatorio r in lista)
                {
                    ListViewItem item = lvConsEsp.Items.Add(r.Descricao);
                    item.SubItems.Add(r.Quantitativo.ToString());
                }
                //--- FIM CARREGA LISTBOX CONSULTA POR ESPECIALIDADE ------------------------





                /**
                 * ######################################
                 * CARREGA GRAFICO CONSULTA POR CONVENIO
                 * ######################################
                 */

                //Grafico de Convenio
                List<Relatorio> graficoConv = new List<Relatorio>();
                graficoConv = srv.qtdConsulta("convenio").ToList();
                chart4.DataSource = graficoConv;
                chart4.DataBind();
                //--- FIM CARREGA GRAFICO CONSULTA POR CONVENIO -------------------------------------------

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


        }

   

    }
}
